using System.Reflection;
using Autofac;

namespace Api.Config;

/// <summary>
/// Autofac依赖注入注册模块
/// </summary>
/// <remarks>
/// 自动扫描并注册接口层、服务层、仓储层和通用层的所有类
/// </remarks>
public class AutofacRegister : Autofac.Module
{
    /// <summary>
    /// 加载模块，注册服务
    /// </summary>
    /// <param name="builder">Autofac容器构建器</param>
    protected override void Load(ContainerBuilder builder)
    {
        // 加载接口层程序集
        Assembly interfaceAssembly =  Assembly.Load("Interface");
        
        // 加载服务层程序集
        Assembly serviceAssembly =  Assembly.Load("Service");
        
        // 加载仓储层程序集
        Assembly repositoryAssembly =  Assembly.Load("Repository");
        
        // 加载通用层程序集
        Assembly commonAssembly =  Assembly.Load("Common");
        
        // 批量注册程序集中的所有类型，并按照实现的接口进行注册
        builder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly, commonAssembly)
            .AsImplementedInterfaces();
        
        // 注册仓储层类型（直接注册为自身，不使用接口）
        builder.RegisterAssemblyTypes(repositoryAssembly)
            .AsSelf()
            .InstancePerLifetimeScope();
        
        // 单独注册泛型仓储类型
        builder.RegisterGeneric(typeof(Repository.BaseRepository<>))
            .AsSelf()
            .InstancePerLifetimeScope();
    }
}